#ifndef __THREAD_POOL_H__
#define __THREAD_POOL_H__

#include <list>
#include <boost/utility.hpp>
#include <boost/function.hpp>
#include <boost/ptr_container/ptr_vector.hpp>

#include "thread.h"
#include "mutex_lock.h"
#include "condition.h"

namespace mars {

class ThreadPool : boost::noncopyable {
    public:
        typedef boost::function<void ()> Task;
        ThreadPool();
        ~ThreadPool();
        void start(int num_thread);

        // 将任务插入队列
        void run(const Task& task);
        void stop();
    private:
        // 从任务队列中取任务
        Task get_task();
        void power();

        // 是否停止
        bool _stop;
        // 任务队列，需要竞争的资源
        std::list<Task> _task_list;
        // ptr_vector 销毁时，会自动销毁它包含的指针对象
        boost::ptr_vector<Thread> _threads;
        // 任务队列的竞争锁
        MutexLock _mutex;
        // 任务队列是否有任务的条件
        Condition _cond;
};

} // namespace mars
#endif //__THREAD_POOL_H__
